home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 4838 / 4838.xpi / chrome / multipletab.jar / content / multipletab / bookmarksOverlay.js next >
Text File  |  2010-02-03  |  7KB  |  230 lines

  1. MultipleTabBookmarkService = { 
  2.     
  3.     init : function MTBS_init() 
  4.     {
  5.         if ('PlacesControllerDragHelper' in window &&
  6.             'onDrop' in PlacesControllerDragHelper) {
  7.             eval('PlacesControllerDragHelper.onDrop = '+
  8.                 PlacesControllerDragHelper.onDrop.toSource().replace(
  9.                     // for Firefox 3.0
  10.                     'var session = this.getSession();',
  11.                     '$& var multipleTabsProxy = session = new MultipleTabDragSessionProxy(session, insertionPoint);'
  12.                 ).replace(
  13.                     // for Firefox 3.5 or later
  14.                     'var dt = this.currentDataTransfer;',
  15.                     '$& var multipleTabsProxy = dt = new MultipleTabDOMDataTransferProxy(dt, insertionPoint);'
  16.                 ).replace( // for Tree Style Tab (save tree structure to bookmarks)
  17.                     'PlacesUIUtils.ptm.doTransaction(txn);',
  18.                     <![CDATA[
  19.                         if ('_tabs' in multipleTabsProxy &&
  20.                             'TreeStyleTabBookmarksService' in window)
  21.                             TreeStyleTabBookmarksService.beginAddBookmarksFromTabs(multipleTabsProxy._tabs);
  22.                         $&
  23.                         if ('_tabs' in multipleTabsProxy &&
  24.                             'TreeStyleTabBookmarksService' in window)
  25.                             TreeStyleTabBookmarksService.endAddBookmarksFromTabs();
  26.                     ]]>
  27.                 )
  28.             );
  29.         }
  30.     },
  31.  
  32.     willBeInsertedBeforeExistingNode : function MTBS_willBeInsertedBeforeExistingNode(aInsertionPoint) 
  33.     {
  34.         // drop on folder in the bookmarks menu
  35.         if (aInsertionPoint.dropNearItemId === void(0))
  36.             return false;
  37.  
  38.         // drop on folder in the places organizer
  39.         if (aInsertionPoint._index < 0 && aInsertionPoint.dropNearItemId < 0)
  40.             return false;
  41.  
  42.         return true;
  43.     },
  44.  
  45.     handleEvent : function MTBS_handleEvent(aEvent) 
  46.     {
  47.         switch (aEvent.type)
  48.         {
  49.             case 'load':
  50.                 window.removeEventListener('load', this, false);
  51.                 this.init();
  52.                 break;
  53.         }
  54.     },
  55.  
  56. }; 
  57.  
  58. window.addEventListener('load', MultipleTabBookmarkService, false);
  59.   
  60. // for Firefox 3.0
  61. function MultipleTabDragSessionProxy(aSession, aInsertionPoint) 
  62. {
  63.     // Don't proxy it because it is not a drag of tabs.
  64.     if (aSession.numDropItems != 1 ||
  65.         !aSession.sourceNode)
  66.         return aSession;
  67.  
  68.     var tab = MultipleTabService.getTabFromChild(aSession.sourceNode);
  69.     if (!tab)
  70.         return aSession;
  71.  
  72.     var tabs = MultipleTabService.getBundledTabsOf(tab);
  73.  
  74.     // Don't proxy it because there is no selection.
  75.     if (tabs.length < 2)
  76.         return aSession;
  77.  
  78.     this._source = aSession;
  79.     this._tabs = tabs;
  80.  
  81.     if (MultipleTabBookmarkService.willBeInsertedBeforeExistingNode(aInsertionPoint))
  82.         this._tabs.reverse();
  83. }
  84.  
  85. MultipleTabDragSessionProxy.prototype = {
  86.     
  87.     _apply : function MTDSProxy__apply(aMethod, aArguments) 
  88.     {
  89.         return this._source[aMethod].apply(this._source, aArguments);
  90.     },
  91.  
  92.     _setDataToTransferable : function MTDSProxy__setDataToTransferable(aTransferable, aType, aData) 
  93.     {
  94.         try {
  95.             var string = Components.classes['@mozilla.org/supports-string;1']
  96.                             .createInstance(Components.interfaces.nsISupportsString);
  97.             string.data = aData;
  98.             aTransferable.setTransferData(aType, string, aData.length * 2);
  99.         }
  100.         catch(e) {
  101.         }
  102.     },
  103.  
  104.     // nsIDragSession 
  105.     get canDrop() { return this._source.canDrop; },
  106.     set canDrop(aValue) { return this._source.canDrop = aValue; },
  107.     get onlyChromeDrop() { return this._source.onlyChromeDrop; },
  108.     set onlyChromeDrop(aValue) { return this._source.onlyChromeDrop = aValue; },
  109.     get dragAction() { return this._source.dragAction; },
  110.     set dragAction(aValue) { return this._source.dragAction = aValue; },
  111.  
  112.     get numDropItems()
  113.     {
  114.         return this._tabs.length;
  115.     },
  116.  
  117.     get sourceDocument() { return this._source.sourceDocument; },
  118.     get sourceNode() { return this._source.sourceNode; },
  119.     get dataTransfer() { return this._source.dataTransfer; },
  120.  
  121.     getData : function MTDSProxy_getData(aTransferable, aIndex)
  122.     {
  123.         var tab = this._tabs[aIndex];
  124.         var uri = tab.linkedBrowser.currentURI;
  125.         if (uri) {
  126.             this._setDataToTransferable(aTransferable, 'text/x-moz-url', uri.spec+'\n'+tab.label);
  127.             this._setDataToTransferable(aTransferable, 'text/unicode', uri.spec);
  128.             this._setDataToTransferable(aTransferable, 'text/html', '<a href="'+uri.spec+'">'+tab.label+'</a>');
  129.         }
  130.         else {
  131.             this._setDataToTransferable(aTransferable, 'text/unicode', 'about:blank');
  132.         }
  133.     },
  134.  
  135.     isDataFlavorSupported : function MTDSProxy_isDataFlavorSupported()
  136.     {
  137.         return this._apply('isDataFlavorSupported', arguments);
  138.     }
  139.  
  140. }; 
  141.   
  142. // for Firefox 3.5 or later
  143. function MultipleTabDOMDataTransferProxy(aDataTransfer, aInsertionPoint) 
  144. {
  145.     // Don't proxy it because it is not a drag of tabs.
  146.     if (aDataTransfer.mozItemCount != 1 ||
  147.         Array.slice(aDataTransfer.mozTypesAt(0)).indexOf(TAB_DROP_TYPE) < 0)
  148.         return aDataTransfer;
  149.  
  150.     var tab = aDataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
  151.     var tabs = MultipleTabService.getBundledTabsOf(tab);
  152.  
  153.     // Don't proxy it because there is no selection.
  154.     if (tabs.length < 2)
  155.         return aDataTransfer;
  156.  
  157.     this._source = aDataTransfer;
  158.     this._tabs = tabs;
  159.  
  160.     if (MultipleTabBookmarkService.willBeInsertedBeforeExistingNode(aInsertionPoint))
  161.         this._tabs.reverse();
  162. }
  163.  
  164. MultipleTabDOMDataTransferProxy.prototype = {
  165.     
  166.     _apply : function MTDOMDTProxy__apply(aMethod, aArguments) 
  167.     {
  168.         return this._source[aMethod].apply(this._source, aArguments);
  169.     },
  170.  
  171.     // nsIDOMDataTransfer 
  172.     get dropEffect() { return this._source.dropEffect; },
  173.     set dropEffect(aValue) { return this._source.dropEffect = aValue; },
  174.     get effectAllowed() { return this._source.effectAllowed; },
  175.     set effectAllowed(aValue) { return this._source.effectAllowed = aValue; },
  176.     get files() { return this._source.files; },
  177.     get types() { return this._source.types; },
  178.     clearData : function MTDOMDTProxy_clearData() { return this._apply('clearData', arguments); },
  179.     setData : function MTDOMDTProxy_setData() { return this._apply('setData', arguments); },
  180.     getData : function MTDOMDTProxy_getData() { return this._apply('getData', arguments); },
  181.     setDragImage : function MTDOMDTProxy_setDragImage() { return this._apply('setDragImage', arguments); },
  182.     addElement : function MTDOMDTProxy_addElement() { return this._apply('addElement', arguments); },
  183.  
  184.     // nsIDOMNSDataTransfer 
  185.     get mozItemCount()
  186.     {
  187.         return this._tabs.length;
  188.     },
  189.  
  190.     get mozCursor() { return this._source.mozCursor; },
  191.     set mozCursor(aValue) { return this._source.mozCursor = aValue; },
  192.  
  193.     mozTypesAt : function MTDOMDTProxy_mozTypesAt()
  194.     {
  195.         return this._apply('mozTypesAt', [0]);
  196.     },
  197.  
  198.     mozClearDataAt : function MTDOMDTProxy_mozClearDataAt()
  199.     {
  200.         this._tabs = [];
  201.         return this._apply('mozClearDataAt', [0]);
  202.     },
  203.  
  204.     mozSetDataAt : function MTDOMDTProxy_mozSetDataAt(aFormat, aData, aIndex)
  205.     {
  206.         this._tabs = [];
  207.         return this._apply('mozSetDataAt', [aFormat, aData, 0]);
  208.     },
  209.  
  210.     mozGetDataAt : function MTDOMDTProxy_mozGetDataAt(aFormat, aIndex)
  211.     {
  212.         var tab = this._tabs[aIndex];
  213.         switch (aFormat)
  214.         {
  215.             case TAB_DROP_TYPE:
  216.                 return tab;
  217.  
  218.             case 'text/x-moz-text-internal':
  219.                 var uri = tab.linkedBrowser.currentURI;
  220.                 return uri ? uri.spec : 'about:blank' ;
  221.         }
  222.  
  223.         return this._apply('mozGetDataAt', [aFormat, 0]);
  224.     },
  225.  
  226.     get mozUserCancelled() { return this._source.mozUserCancelled; }
  227.  
  228. }; 
  229.   
  230.